// axios全局配置

import type { InternalAxiosRequestConfig } from "axios"
import axios from "axios";

// 全局 axios 默认值
axios.defaults.baseURL = '/api';  // !!!
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
// axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;


import router from "@/router/index"
import _ from "lodash";   // 加装 @type/loadsh

let whiteList = ["/login"];


// function toLogin(){ // 原函数
//   console.log("去登录!!!");

//   store.dispatch('exitAndUpdateAuthority')
//   let currentRoute = router.currentRoute.value;
//   router.replace({path:"/login",query:{ReturnUrl: currentRoute.fullPath}})
// }

// 防抖处理  => 返回防抖版的新函数
let toLogin = _.debounce(function () { // 原本跳转登录需要执行的函数  => 做防抖处理
  console.log("去登录!!!");

  let currentRoute = router.currentRoute.value;
  router.replace({ path: "/login", query: { ReturnUrl: currentRoute.fullPath } })
}, 300);


// 添加请求拦截器  => 请求发送之前,先执行对应的回调函数(拦截函数)  =>1. 回调函数有一个参数(config => axios请求相关配置)  2. 回调函数返回值,才是真正传入的请求配置中
axios.interceptors.request.use(function (config: InternalAxiosRequestConfig) {
  // 在发送请求之前做些什么
  // console.log("请求发送前", config);

  // 携带token  (配合白名单)
  // if (!whiteList.includes(config.url as string)) {
  //   let token = store.state.authority.token;
  //   console.log("非白名单携带token", token);
  //   if (token) {
  //     config.headers["token"] = token
  //   }
  // }

  return config;
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error);
});

// 添加响应拦截器  => 服务器返回的数据被用户接收之前,先执行对应的回调函数(拦截函数)  1. 回调函数有一个参数responseOption 响应配置对象 {config,data,status}  2. 回调函数的返回值,才是axios后续then方法接收的数据
axios.interceptors.response.use(function (response) {
  // 2xx 范围内的状态码都会触发该函数。 (xhr.status == 2xx)  请求成功,服务器返回响应数据
  // 对响应数据做点什么
  // console.log("接收响应前", response);
  // return response;  // 默认返回响应配置对象  {config,status,data,request}
  // return response.data;  // 默认返回响应配置对象中data  => 后端返回的具体数据(数据增删改查结果对象)

  // 能走到此处
  /*  
   1. xhr.status == 2xx   请求成功,服务器返回响应数据
   2. 响应数据中包含后端给用户返回的调用接口操作数据库增删改查的结果{code,message}  => 操作成功/操作失败
   {   // 以登录为例
       "code": "200" || '10003' || '10005',
       "message": "登录成功" || 密码错误 ｜| 未注册,
        token:"xxx"
   } 
   */
  let result = response.data;  // 后端返回的响应数据

  let { code, message } = result;

  if (code == 200) { // 服务器确实响应了,但是用户调用接口进行数据增删改查的时候 也是成功的
    return response.data;
  } else if (code == "10119") {
    /* 
    token 无效/过期  => 重新登录, 登录完毕,回到原本所在页面
        1. 当前文件时js文件 => 不能通过 this.$route获取当前页面信息,
         => 解决方法: 通过router.currentRoute  可以获取当前路由信息(ref对象,组合式语法中的一个对象,也是用来存储数据的,但是数据存储在ref对象的value属性中)

         简单来说  当前路由信息 router.currentRoute.value


        2.  去登录之前, 清除本地存储的数据和vuex中的数据
    
    
    
    */
    //  console.log("token过期",router);
    //  console.log("token过期:当前路由信息",router.currentRoute);
    //  console.log("token过期:当前路由信息",router.currentRoute.value);
    toLogin();


    var err = new Error(message);
    return Promise.reject(err);
  } else { // 服务器确实响应了, 但是用户调用接口进行数据增删改查的时候 可能操作失败
    var err = new Error(message);
    return Promise.reject(err);
  }

}, function (error) {
  // 超出 2xx 范围的状态码都会触发该函数。  (xhr.status == 1xx 3xx 4xx 5xx) 服务器没有响应
  // 对响应错误做点什么
  return Promise.reject(error);
});





export default axios;